﻿#include <iostream>
#include "TA.h"
#include <memory>

int main()
{
	std::cout << "Hello World!\n";

	//智能指针，std::unique_ptr应该完全拥有它管理的对象，而不是与其他类共享该所有权。
	std::unique_ptr<MyClass> ms{ new MyClass() };
	ms->Print();

	//使用unique_ptr后，超出作用域后，自动释放ms


	//std::unique_ptr被设计为单独拥有和管理资源，
	//而std::shared_ptr旨在解决需要多个智能指针共同拥有资源的情况。
	// 动态分配一个 Resource 对象，并将所有权赋给 std::shared_ptr
	MyClass* res{ new MyClass };
	std::shared_ptr<MyClass> ptr1{ res };
	{
		// 让另外的 std::shared_ptr 也指向相同的资源
		std::shared_ptr<MyClass> ptr2{ ptr1 };
		std::cout << "Killing one shared pointer\n";
	}

	// ptr2 超出作用域, 但资源仍被ptr1持有
	std::cout << "Killing another shared pointer\n";

	/*
		可以使用delete关键字通过删除拷贝构造函数和拷贝赋值运算符来禁用类的复制语义。
		std::move允许您将左值视为右值。当我们想在左值上调用移动语义而不是复制语义时，这很有用。
		std::unique_ptr是您最可能使用的智能指针类。它管理单个不可共享的资源。应首选std::make_unique()（自C++14起）来创建新的std::unique_ptr。std::unique_ptr禁用复制语义。
		std::shared_ptr是当需要多个对象访问同一资源时使用的智能指针类。在销毁管理资源的最后一个std::shared_ptr之前，不会销毁该资源。应首选 std::make_shared() 来创建新的std::shared_ptr。对于std::shared_ptr，应该使用复制语义来创建指向同一对象的其他std::shared_ptr。
		std::weak_ptr是当您需要一个或多个能够查看和访问由std:∶shared_ptr管理资源的对象时使用的智能指针类，但与std::shared_ptr不同的是，在确定是否应销毁资源时，不考虑std::weak_ptr。
		
		

		对象关系：
		属性					组合		聚合		关联		依赖
		关系类型				部分-整体	部分-整体	相互关联	依赖
		成员可以属于多个类			否		是		    是			是
		成员生命周期由类管理		是		否		    否			否
		关系指向				单向		单向	    单向或双向	单向
		关系术语				一部分		有一个	    使用一个	依赖于
		
		*/
}
